/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.DiagnosticoYTriageInternacionFisica;
import hibernate.objeto.DiagnosticoYTriageInternacion;
import hibernate.objeto.EpicrisisInternacion;
import hibernate.objeto.Evolucion;
import hibernate.objeto.EvolucionEnfermeriaDeInternacion;
import hibernate.objeto.Interconsulta;
import hibernate.objeto.Paciente;
import hibernate.objeto.TratamientoYPractica;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import java.util.Vector;
import presentacion.CapaPresentacion;

/**
 *
 * @author Gonzalo
 */
public class DiagnosticoYTriageInternacionLogica extends CapaLogica {

    /**
     * Crea y persiste el diagnóstico para el paciente.
     *
     * @param datosDiagnosticoYTriageInternacion Los datos a cargar
     * correspondientes a el diagnóstico y el triage
     * @param paciente El objeto Paciente
     * @param diagnosticoYTriageInternacion El objeto DiagnosticoYTriageInternacion
     * a agregar/modificar
     * @param idDiagnosticoYTriageInternacion El arreglo en donde se guarda
     * el id del objeto DiagnosticoYTriageInternacion creado para su posterior
     * recuperación
     * @return true si se agregó correctamente, false en caso contrario
     */
    public static boolean agregarDiagnosticoYTriageInternacion(
            Object[] datosDiagnosticoYTriageInternacion, Paciente paciente,
            DiagnosticoYTriageInternacion diagnosticoYTriageInternacion,
            int[] idDiagnosticoYTriageInternacion) {

        //Si es una modificacion
        if (idDiagnosticoYTriageInternacion[0] != -1) {
            //Escribe el log
            backUpModificacion(idDiagnosticoYTriageInternacion[0]);
        }
        
        diagnosticoYTriageInternacion = crearUObtenerObjetoDiagnosticoYTriageInternacion(
                datosDiagnosticoYTriageInternacion, paciente,
                diagnosticoYTriageInternacion);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(diagnosticoYTriageInternacion)) {
            idDiagnosticoYTriageInternacion[0] = diagnosticoYTriageInternacion.
                    getIdDiagnosticoYTriageInternacion();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea un objeto DiagnosticoYTriageInternacion con los datos pasados por
     * parámetro.
     *
     * @param datosDiagnosticoYTriageInternacion Los datos a cargar
     * @param paciente El objeto Paciente
     * @param diagnosticoYTriageInternacion El objeto DiagnosticoYTriageInternacion 
     * a agregar/modificar
     * @return El objeto DiagnosticoYTriageInternacion creado
     */
    private static DiagnosticoYTriageInternacion
            crearUObtenerObjetoDiagnosticoYTriageInternacion(
            Object[] datosDiagnosticoYTriageInternacion, Paciente paciente,
            DiagnosticoYTriageInternacion diagnosticoYTriageInternacion) {

        if (diagnosticoYTriageInternacion == null) {
            diagnosticoYTriageInternacion =
                    new DiagnosticoYTriageInternacion();
        }

        diagnosticoYTriageInternacion.
                setHoraDiagnosticoYTriageInternacion(
                (String) datosDiagnosticoYTriageInternacion[
                DIAGNOSTICO_Y_TRIAGE_INTERNACION_HORA]);

        diagnosticoYTriageInternacion.
                setFechaDiagnosticoYTriageInternacion(
                (Date) datosDiagnosticoYTriageInternacion[
                DIAGNOSTICO_Y_TRIAGE_INTERNACION_FECHA]);

        diagnosticoYTriageInternacion.
                setDiagnosticoDiagnosticoYTriageInternacion(
                (String) datosDiagnosticoYTriageInternacion[
                DIAGNOSTICO_Y_TRIAGE_INTERNACION_DIAGNOSTICO]);

        diagnosticoYTriageInternacion.
                setDescripcionDiagnosticoDiagnosticoYTriageInternacion(
                (String) datosDiagnosticoYTriageInternacion[
                DIAGNOSTICO_Y_TRIAGE_INTERNACION_DESCRIPCION_DIAGNOSTICO]);

        diagnosticoYTriageInternacion.
                setEstadoDiagnosticoYTriageInternacion("Activa");

        //Seteo del paciente
        diagnosticoYTriageInternacion.setPaciente(paciente);

        return diagnosticoYTriageInternacion;
    }

    /**
     * Actualiza la epicrisis a la internación.
     *
     * @param epicrisisInternacion El objeto EpicrisisInternacion que se asocia
     * a la internación
     * @param diagnosticoYTriageInternacion La internación a actualizar
     * @return true si se actualizó correctamente, false en caso contrario
     */
    static boolean actualizarEpicrisisInternacion(
            EpicrisisInternacion epicrisisInternacion,
            DiagnosticoYTriageInternacion diagnosticoYTriageInternacion) {
        diagnosticoYTriageInternacion.setEpicrisisInternacion(epicrisisInternacion);
        diagnosticoYTriageInternacion.setEstadoDiagnosticoYTriageInternacion(
                "No activa");

        if (CapaFisica.guardarOActualizarObjeto(diagnosticoYTriageInternacion)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Retorna el vector de Diagnósticos que un paciente tiene asociadas.
     *
     * @param idPaciente El id del paciente a consultar
     * @return El vector de objetos DiagnosticoYTriageInternacion consultado
     */
    public static Vector<DiagnosticoYTriageInternacion>
            getVectorDiagnosticoYTriageInternacionPorIdPaciente(
            int idPaciente) {
        return DiagnosticoYTriageInternacionFisica.
                getVectorDiagnosticoYTriageInternacionPorIdPaciente(
                idPaciente);
    }

    /**
     * Retorna el objeto DiagnosticoYTriageInternacion según el id.
     *
     * @param idDiagnosticoYTriageInternacion El id del DiagnosticoYTriageInternacion
     * @return El objeto DiagnosticoYTriageInternacion consultado, null si no existe
     */
    public static DiagnosticoYTriageInternacion getDiagnosticoYTriageInternacionPorId(
            int idDiagnosticoYTriageInternacion) {
        return DiagnosticoYTriageInternacionFisica.getDiagnosticoYTriageInternacionPorId(
                idDiagnosticoYTriageInternacion);
    }

    /**
     * Escribe un archivo de texto el cual es una imagen del objeto que se
     * ha modificado y sus objetos asociados, guardando el mismo en la tabla.
     *
     * @param idObjeto El id del objeto a resguardar
     */
    private static void backUpModificacion(int idObjeto) {
        String rutaLogLocal = DIRECTORIO_DE_TRABAJO + "\\" +
                    DiagnosticoYTriageInternacion.class.getName() + ".txt";
        //Se recupera el objeto para recupera el archivo
        DiagnosticoYTriageInternacion diagnosticoYTriageInternacion =
                DiagnosticoYTriageInternacionLogica.
                getDiagnosticoYTriageInternacionPorId(idObjeto);

        File log = CapaLogica.byteArrayToFile(rutaLogLocal,
                diagnosticoYTriageInternacion.getArchivoLogDiagnosticoYTriageInternacion());

        if (log == null) {
            log = new File(rutaLogLocal);
        }

        //Se manipula el log
        escribirLogDiagnosticoYTriageInternacion(
                diagnosticoYTriageInternacion, rutaLogLocal);

        //Se guarda
        byte[] bFile = new byte[(int) log.length()];

        try {
            FileInputStream fileInputStream = new FileInputStream(log);
            //convert file into array of bytes
            fileInputStream.read(bFile);
            fileInputStream.close();
        } catch (Exception exc) {
            System.err.println(exc.getMessage());
        }

        //Setea el adjunto
        diagnosticoYTriageInternacion.setArchivoLogDiagnosticoYTriageInternacion(
                bFile);
        eliminarArchivosTemporales();
    }

    /**
     * Escribe el objeto en un archivo.
     *
     * @param diagnosticoYTriageInternacion El objeto a resguardar
     * @param log El archivo en donde escribir
     * @return true si se escribio correctamente, false en caso contrario
     */
    public static boolean escribirLogDiagnosticoYTriageInternacion(
            DiagnosticoYTriageInternacion diagnosticoYTriageInternacion,
            String rutaLog) {

        try {
            //DiagnosticoYTriageInternacion
            String diagnosticoYTriageInternacionString =
                    getDiagnosticoYTriageInternacionString(
                    diagnosticoYTriageInternacion);

            Vector<EvolucionEnfermeriaDeInternacion> 
                    vectorEvolucionEnfermeriaDeInternacion =
                    EvolucionEnfermeriaDeInternacionLogica.
                    getVectorEvolucionEnfermeriaDeInternacionPorIdDiagnosticoYTriageInternacion(
                    diagnosticoYTriageInternacion.getIdDiagnosticoYTriageInternacion());
            
            if (vectorEvolucionEnfermeriaDeInternacion != null) {
                for (int i = 0; i < vectorEvolucionEnfermeriaDeInternacion.size(); i++) {
                    diagnosticoYTriageInternacionString += SEPARADOR;
                    diagnosticoYTriageInternacionString +=
                            EvolucionEnfermeriaDeInternacionLogica.
                            getEvolucionEnfermeriaDeInternacionString(
                            vectorEvolucionEnfermeriaDeInternacion.get(i));
                }
            }

            //Evoluciones
            Vector<Evolucion> vectorEvolucion = EvolucionLogica.
                    getVectorEvolucionPorIdDiagnosticoYTriageInternacion(
                    diagnosticoYTriageInternacion.getIdDiagnosticoYTriageInternacion());
            if (vectorEvolucion != null) {
                for (int i = 0; i < vectorEvolucion.size(); i++) {
                    diagnosticoYTriageInternacionString += SEPARADOR;
                    diagnosticoYTriageInternacionString +=
                            EvolucionLogica.getEvolucionString(
                            vectorEvolucion.get(i));
                }
            }

            Vector<Interconsulta> vectorInterconsultas = InterconsultaLogica.
                    getVectorInterconsultaPorIdDiagnosticoYTriageInternacion(
                    diagnosticoYTriageInternacion.getIdDiagnosticoYTriageInternacion());
            if (vectorInterconsultas != null) {
                for (int i = 0; i < vectorInterconsultas.size(); i++) {
                    diagnosticoYTriageInternacionString += SEPARADOR;
                    diagnosticoYTriageInternacionString +=
                                InterconsultaLogica.getInterconsultaString(
                                vectorInterconsultas.get(i));
                }
            }

            //TratamientoYPracticas
            Vector<TratamientoYPractica> vectorTratamientoYPractica =
                    TratamientoYPracticaLogica.
                    getVectorTratamientoYPracticaPorIdDiagnosticoYTriageInternacion(
                    diagnosticoYTriageInternacion.getIdDiagnosticoYTriageInternacion());
            if (vectorTratamientoYPractica != null) {
                for (int i = 0; i < vectorTratamientoYPractica.size(); i++) {
                    diagnosticoYTriageInternacionString += SEPARADOR;
                    diagnosticoYTriageInternacionString +=
                                TratamientoYPracticaLogica.getTratamientoYPracticaString(
                                vectorTratamientoYPractica.get(i));
                }
            }

            BufferedWriter bw = new BufferedWriter(new FileWriter(rutaLog, true));
            diagnosticoYTriageInternacionString += "\n" + SEPARADOR + "\n";
            //Escribe los datos del objeto
            bw.write(diagnosticoYTriageInternacionString);

            bw.close();
        } catch (IOException exception) {
            System.err.println(exception.getMessage());
            return false;
        }

        return true;
    }

    /**
     * Retorna todo el objeto DiagnosticoYTriageInternacion en string.
     *
     * @param diagnosticoYTriageInternacion El objeto a escribir
     */
    public static String getDiagnosticoYTriageInternacionString(
            DiagnosticoYTriageInternacion diagnosticoYTriageInternacion) {
        String diagnosticoYTriageInternacionString =
                "idPaciente: " +
                diagnosticoYTriageInternacion.getPaciente().getIdPaciente() + "\n" +
                "idDiagnosticoYTriageInternacion: " +
                diagnosticoYTriageInternacion.getIdDiagnosticoYTriageInternacion() + "\n" +
                "horaDiagnosticoYTriageInternacion: " +
                diagnosticoYTriageInternacion.getHoraDiagnosticoYTriageInternacion() + "\n" +
                "fechaDiagnosticoYTriageInternacion: " +
                diagnosticoYTriageInternacion.getFechaDiagnosticoYTriageInternacion() + "\n" +
                "diagnosticoDiagnosticoYTriageInternacion: " +
                diagnosticoYTriageInternacion.getDiagnosticoDiagnosticoYTriageInternacion() + "\n" +
                "descripcionDiagnosticoDiagnosticoYTriageInternacion: " +
                diagnosticoYTriageInternacion.getDescripcionDiagnosticoDiagnosticoYTriageInternacion() + "\n" +
                "estadoDiagnosticoYTriageInternacion: " +
                diagnosticoYTriageInternacion.getEstadoDiagnosticoYTriageInternacion() + "\n";

        if (diagnosticoYTriageInternacion.getTriage() != null) {
            diagnosticoYTriageInternacionString += TriageLogica.getTriageString(
                    diagnosticoYTriageInternacion.getTriage());
        }

        if (diagnosticoYTriageInternacion.getEpicrisisInternacion() != null) {
            diagnosticoYTriageInternacionString +=
                    EpicrisisInternacionLogica.getEpicrisisInternacionString(
                    diagnosticoYTriageInternacion.getEpicrisisInternacion());
        }
        
        return diagnosticoYTriageInternacionString;
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion del
     * DiagnosticoYTriageInternacion.
     *
     * @param diagnosticoYTriageInternacion El episodio de internación
     * @return El String que contiene el HTML
     */
    public static String getDiagnosticoYTriageInternacionHTML(
            DiagnosticoYTriageInternacion diagnosticoYTriageInternacion) {

        String diagnosticoYTriageInternacionHTML = "";

        if (diagnosticoYTriageInternacion != null) {
            String epicrisisHTML = "";
            String triageHTML = "";
            String evolucionesHTML = "";
            String evolucionesEnfermeriaDeInternacionHTML = "";
            String interconsultasHTML = "";

        //Epicrisis
        epicrisisHTML += "</font><br><br><hr /><hr /><br>";
        epicrisisHTML += EpicrisisInternacionLogica.getEpicrisisHTML(
                            diagnosticoYTriageInternacion.getEpicrisisInternacion());

        //Triage
        triageHTML += "</font><br><br><hr /><hr /><br>";
        triageHTML += TriageLogica.getTriageHTML(
                            diagnosticoYTriageInternacion.getTriage());


        //Evoluciones
            Vector<Evolucion> vectorEvolucion = EvolucionLogica.
                    getVectorEvolucionPorIdEnfermedadYDiagnosticoAmbulatorio(
                    diagnosticoYTriageInternacion.getIdDiagnosticoYTriageInternacion());
            if (vectorEvolucion != null) {
                for (int i = 0; i < vectorEvolucion.size(); i++) {
                    evolucionesHTML += "</font><br><br><hr /><hr /><br>";
                    evolucionesHTML += EvolucionLogica.getEvolucionHTML(
                            vectorEvolucion.get(i));
                }
            }

        //Evoluciones enfermeria de internacion
            Vector<EvolucionEnfermeriaDeInternacion>
                    vectorEvolucionEnfermeriaDeInternacion = EvolucionEnfermeriaDeInternacionLogica.
                    getVectorEvolucionEnfermeriaDeInternacionPorIdDiagnosticoYTriageInternacion(
                    diagnosticoYTriageInternacion.getIdDiagnosticoYTriageInternacion());
            if (vectorEvolucionEnfermeriaDeInternacion != null) {
                for (int i = 0; i < vectorEvolucionEnfermeriaDeInternacion.size(); i++) {
                    evolucionesEnfermeriaDeInternacionHTML += "</font><br><br><hr /><hr /><br>";
                    evolucionesEnfermeriaDeInternacionHTML += EvolucionEnfermeriaDeInternacionLogica.
                            getEvolucionEnfermeriaDeInternacionHTML(
                            vectorEvolucionEnfermeriaDeInternacion.get(i));
                }
            }

        //Interconsultas
            Vector<Interconsulta> vectorInterconsultas = InterconsultaLogica.
                    getVectorInterconsultaPorIdEnfermedadYDiagnosticoAmbulatorio(
                    diagnosticoYTriageInternacion.getIdDiagnosticoYTriageInternacion());
            if (vectorInterconsultas != null) {
                for (int i = 0; i < vectorEvolucion.size(); i++) {
                    interconsultasHTML += "</font><br><br><hr /><hr /><br>";
                    interconsultasHTML += InterconsultaLogica.getInterconsultaHTML(
                            vectorInterconsultas.get(i));
                }
            }


        diagnosticoYTriageInternacionHTML = "<font size=\"3\" face=\"arial\" color=\"blue\">INTERNACIÓN</font><br><br> "
                    + "<hr /><font size=\"3\" face=\"arial\" color=\"blue\">Fecha: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaPresentacion.imprimirFecha(diagnosticoYTriageInternacion.
                    getFechaDiagnosticoYTriageInternacion()) + " - " +
                    diagnosticoYTriageInternacion.getHoraDiagnosticoYTriageInternacion() + "</font><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Estado: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaLogica.capitalizeFirstLetter(diagnosticoYTriageInternacion.
                    getEstadoDiagnosticoYTriageInternacion()) + "</font><br><hr /><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Diagnóstico: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    diagnosticoYTriageInternacion.
                    getDiagnosticoDiagnosticoYTriageInternacion() + "</font><br><br>"
                    + "<font size=\"3\" face=\"arial\" color=\"blue\">Descripcion: </font><br>"
                    + "<font size=\"3\" face=\"arial\">" +
                    diagnosticoYTriageInternacion.
                    getDescripcionDiagnosticoDiagnosticoYTriageInternacion()
                    + epicrisisHTML
                    + triageHTML
                    + evolucionesHTML
                    + evolucionesEnfermeriaDeInternacionHTML
                    + interconsultasHTML;
        } else {
            diagnosticoYTriageInternacionHTML = "<font size=\"3\" face=\"arial\" color=\"blue\">INTERNACIÓN</font><br><br> " +
                    "<hr /><font size=\"3\" face=\"arial\">No posee</font><br></font><hr />";
        }
        return diagnosticoYTriageInternacionHTML;
    }
    
}
